//
//  EmoticonPackage.swift
//  表情键盘
//
//  Created by apple on 15/7/8.
//  Copyright © 2015年 apple. All rights reserved.
//

import UIKit

class EmoticonPackage: NSObject {
    /// 表情路径
    var id: String?
    /// 分组名称
    var groupName: String?
    /// 表情数组
    var emoticons: [Emoticon]?
    
    init(id: String) {
        self.id = id
    }
    
    ///  添加喜爱的表情
    func addFavoriteEmoticon(emoticon: Emoticon) {
        
        // 判断数组中是否已经包含该表情
        let contain = emoticons!.contains(emoticon)
        if !contain {
            // 将表情添加到 `最近的` emoticons 数组
            emoticons?.append(emoticon)
        }
        
        // 根据 times 进行数组排序，删除末尾记录
        var result = emoticons!
        // 对数组进行排序
        //        result = result.sort({ (e1, e2) -> Bool in
        //            e1.times > e2.times
        //        })
        // 排序的简写
        result = result.sort { $0.times > $1.times }
        
        if !contain {
            // 删除末尾的表情
            result.removeLast()
        }
        
        // 重新设置表情数组
        emoticons = result
    }

    class func packages()->[EmoticonPackage] {
        
        var list = [EmoticonPackage]()
        let p = EmoticonPackage(id: "")
        p.groupName = "最近"
        // 追加表情
        p.appendEmptyEmoticons()
        list.append(p)
        
        
       
        let path = NSBundle.mainBundle().pathForResource("emoticons.plist", ofType: nil, inDirectory: "Emoticons.bundle")!
        let dict = NSDictionary(contentsOfFile: path)!
        let array = dict["packages"] as! [[String:AnyObject]]
        
        for d in array{
            
            // 根据 id 的内容分别加载表情数组
            let p = EmoticonPackage(id: d["id"] as! String)
            p.loadEmoticons()
            p.appendEmptyEmoticons()
            
            list.append(p)
        
        }
        
        return list
    }
    private func loadEmoticons() {
        
        // 加载 id 路径对应的 info.plist
        print(plistPath())
        let dict = NSDictionary(contentsOfFile: plistPath())!
        // 设置分组名
        groupName = dict["group_name_cn"] as? String
        let array = dict["emoticons"] as! [[String: String]]
        
        // 实例化表情数组
        emoticons = [Emoticon]()
        var index = 0
        for d in array{
        
         emoticons?.append(Emoticon(id: id, dict: d))

         index++
            if index == 20 {
                emoticons?.append(Emoticon(isRemoveButton: true))
                index = 0
            }
            
        }
    }
    
    ///  追加空白按钮，方便界面布局，如果一个界面的图标不足20个，补足，最后添加一个删除按钮
    private func appendEmptyEmoticons() {
        
        if emoticons == nil {
            emoticons = [Emoticon]()
        }
        
        let count = emoticons!.count % 21
        if count > 0 || emoticons!.count == 0 {
            for _ in count..<20 {
                // 追加空白按钮
                emoticons?.append(Emoticon(isRemoveButton: false))
            }
            // 追加一个删除按钮
            emoticons?.append(Emoticon(isRemoveButton: true))
        }
    }
    ///  返回 info.plist 的路径
    private func plistPath() -> String {
        return EmoticonPackage.bundlePath().stringByAppendingPathComponent(id!).stringByAppendingPathComponent("info.plist")
    }
    
    /// 返回表情包路径
    private class func bundlePath() -> String {
        return NSBundle.mainBundle().bundlePath.stringByAppendingPathComponent("Emoticons.bundle")
    }

}

class Emoticon:NSObject {
    /// 表情路径
    var id: String?
    /// 表情文字，发送给新浪微博服务器的文本内容
    var chs: String?
    /// 表情图片，在 App 中进行图文混排使用的图片
    var png: String?
    /// UNICODE 编码字符串
    var code: String? {
        didSet {
            // 1. 扫描器，可以扫描指定字符串中特定的文字
            let scanner = NSScanner(string: code!)
            // 2. 扫描整数 Unsafe`Mutable`Pointer 可变的指针，要修改参数的内存地址的内容
            var result: UInt32 = 0
            scanner.scanHexInt(&result)
            
            // 3. 生成字符串：UNICODE 字符 -> 转换成字符串
            emoji = "\(Character(UnicodeScalar(result)))"
        }
    }
    /// emoji 字符串
    var emoji: String?
    /// 图片的完整路径 - 计算型属性，只读属性
    var imagePath: String? {
        return png == nil ? nil : EmoticonPackage.bundlePath().stringByAppendingPathComponent(id!).stringByAppendingPathComponent(png!)
    }
    /// 是否删除按钮标记
    var removeButton = false
    /// 用户使用次数
    var times = 0
    
    init(isRemoveButton: Bool) {
        removeButton = isRemoveButton
    }
    
    init(id: String?, dict: [String: String]) {
        super.init()
        
        self.id = id
        
        // 使用 KVC 设置属性之前，必须调用 super.init
        setValuesForKeysWithDictionary(dict)
    }

    
    // 只要重写，就会过滤调用未定义的key - 再使用 setValuesForKeysWithDictionary 就不会崩溃了
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {
        
    }

}